package com.gather.arraylists;

import java.util.ArrayList;
import java.util.HashSet;

// ArrayList 链表学习
public class Example01 {
    public static void main(String[] args) {
        System.out.println("ArrayList学习");
        /**
         * 1.add() 添加
         * 2.addAll() 集合合并
         */
        ArrayList<String> strList = new ArrayList<>();
        strList.add("a");
        strList.add("b");
        strList.add("c");
        strList.add("e");
        System.out.println(strList);
        // 指定位置添加
        strList.add(3,"d");
        System.out.println(strList);
        
        // 添加集合 addAll()
        ArrayList<String> strAddList = new ArrayList<>();
        strAddList.add("f");
        strAddList.add("g");
        System.out.println(strAddList);
        // 把strList 集合添加到 strAddList 中去
        strAddList.addAll(strList);
        System.out.println(strAddList); // [f, g, a, b, c, d, e]
        // 指定位置添加
        strAddList.addAll(0,strList);
        System.out.println(strAddList);
        System.out.println("---- set ----");
        // 将集合 Set 中的元素插入
        HashSet<String> strHash = new HashSet<>();
        strHash.add("java");
        strHash.add("php");
        strHash.add("css");
        System.out.println("hashSet: "+strHash);
        // 创建一个动态数组
        ArrayList<String> strSet = new ArrayList<>();
        strSet.add("python");
        System.out.println(strSet);
        // 把 hashSet 中所有的元素添加到 strSet list链表中
        strSet.addAll(strHash);
        System.out.println(strSet);
        System.out.println("---- set end ----");
        /**
         * clear() 清除所有元素
         */
        strAddList.clear();
        System.out.println(strAddList);// []
        System.out.println("---- clone() 浅拷贝 ----");
        /**
         * clone() 方法用于拷贝一份动态数组，属于浅拷贝。
         */
        System.out.println("克隆ArrayList "+strList.clone());
        // 返回ArrayList 对象。
        ArrayList<String> clone = (ArrayList<String>)strList.clone();
        System.out.println(clone);
        System.out.println("---- clone() ----");
        /**
         * contains() 方法用于判断元素是否在动态数组中
         * 存在 true
         * 不存在 false
         */
        boolean f = strList.contains("f");
        System.out.println(f ? "f 不存在" : "f 存在");
        boolean b = strList.contains("b");
        System.out.println(b ? "b 字母存在" : "b 不存在");
        /**
         * get() 获取元素
         */
        // 获取指定下标
        String s = strList.get(1);
        System.out.println(s);
        /**
         * indexOf() 方法返回动态数组中元素的索引值。
         * 存在返回 位置索引值（多个 返回最新那个）
         * 不存在 返回 -1
         */
        int b1 = strList.indexOf("b");
        System.out.println(b1);
        /**
         * remove() 删除指定元素或者索引指定位置
         * removeAll() 方法用于删除存在于指定集合中的动态数组元素。
         * 方法和 clear()差不多
         */
        System.out.println("-----remove()----");
        System.out.println(strList);
        strList.remove(1);
        System.out.println(strList);
        // 删除指定值
        strList.remove("a");
        System.out.println(strList);
        // 删除全部操作
        strAddList.removeAll(strAddList);
        System.out.println("删除集合全部元素 "+strAddList); // []
        // 在某一个集合内，删除与另一个集合共同存在的元素
        ArrayList<String> strRemoveList = new ArrayList<>();
        strRemoveList.add("a");
        strRemoveList.add("b");
        strRemoveList.add("c");
        strRemoveList.add("d");
        ArrayList<String> strRemoveList2 = new ArrayList<>();
        strRemoveList2.add("b");
        strRemoveList2.add("c");
        strRemoveList2.add("e");
        System.out.println(strRemoveList.removeAll(strRemoveList2));
        // 在strRemoveList集合中删除掉与strRemoveList2 共同存在的元素  [a, d]
        System.out.println("删掉后的strRemoveList "+strRemoveList);
        System.out.println("-----remove() end----");
        /**
         * size() 方法用于返回动态数组中元素的数量。
         */
        System.out.println("---size---");
        System.out.println(strList.size());
        System.out.println("---size---");
        /**
         * isEmpty() 方法用于判断动态数组是否为空。
         * 返回 false / true
         */
        System.out.println("--- isEmpty ---");
        boolean empty = strAddList.isEmpty();
        System.out.println("集合是否为空："+empty); // true
        System.out.println("--- isEmpty ---");
        /**
         * subList(fromIndex,toIndex) 方法用于截取并返回动态数组中的一部分。
         * fromIndex - 截取元素的起始位置，包含该索引位置元素
         * toIndex - 截取元素的结束位置，不包含该索引位置元素
         * 前闭后开
         */
        System.out.println("--- subList() ---");
        strList.add("g");
        strList.add("o");
        strList.add("l");
        System.out.println(strList); // [c, d, e, g, o, l]
        System.out.println(strList.subList(1,3)); // [d, e]
        System.out.println("--- subList() end ---");
        /**
         * set() 修改指定索引的元素的值。
         */
        System.out.println("---- set() ----");
        strList.set(3,"kerry");
        System.out.println(strList); // [c, d, e, kerry, o, l]
        System.out.println("---- set() ----");

        /**
         * toArray() 方法将 Arraylist 对象转换为数组。
         */
        System.out.println("--- toArray() ---");
        String[] strings = new String[strList.size()];
        strings = strList.toArray(strings);
        for (String string : strings) {
            System.out.println(string);
        }
        System.out.println("--- toArray() end ---");
        /**
         * lastIndexOf() 方法返回指定元素在动态数组中最后一次出现的位置。
         */
        System.out.println("----- lastIndexOf()  -----");
        strList.add("e");
        strList.add("q");
        strList.add("e");
        System.out.println(strList);// [c, d, e, kerry, o, l, e, q, e]
        System.out.println(strList.lastIndexOf("e")); // 8
        System.out.println("----- lastIndexOf() end -----");

        /**
         * retainAll() 求两个集合的并集，删除差集元素
         * 返回 true 删除成功
         * 没有公共 集合为 空
         * 有公共集合剩余公共元素
         */
        System.out.println("---- 求并集 ----");
        ArrayList<Integer> integersList = new ArrayList<>();
        integersList.add(1);
        integersList.add(2);
        integersList.add(3);
        integersList.add(5);

        ArrayList<Integer> integersList_2 = new ArrayList<>();
        integersList_2.add(7);
        integersList_2.add(38);
        boolean b2 = integersList.retainAll(integersList_2);
        System.out.println(b2);
        // 如果两个集合没有公共元素 integersList:[] 为空，
        System.out.println("保留的元素 "+integersList);
        System.out.println("---- 求并集 end----");

        /**
         * containsAll() 方法用于检测 arraylist 是否包含指定集合中的所有元素。
         * 大范围包含小范围
         * 返回值：true / false
         */
        System.out.println("---- containsAll ----");
        ArrayList<String> sites = new ArrayList<>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        System.out.println("ArrayList 1: " + sites);
        // 创建另一个动态数组
        ArrayList<String> sites2 = new ArrayList<>();
        // 往动态数组中添加元素
        sites2.add("Runoob");
        sites2.add("Google");
        System.out.println("ArrayList 2: " + sites2);
        // 检查动态数组1是否包含动态数组2
        boolean result1 = sites.containsAll(sites2);
        System.out.println("ArrayList 1 包含了 ArrayList 2 的所有元素: " + result1);
        // 检查数组2是否包含数组1
        boolean result2 = sites2.containsAll(sites);
        System.out.println("ArrayList 2 包含了 ArrayList 1 的所有元素: " + result2);
        System.out.println("---- containsAll end ----");

        /**
         * replaceAll() 方法用于将给定的操作内容替换掉数组中每一个元素.
         */
        System.out.println("---- replaceAll() 替换---");
        // 把元素全部替换成为大写的
        sites.replaceAll(e->e.toUpperCase());
        System.out.println("替换过后 "+sites);
        System.out.println("---- replaceAll end ---");
        /**
         * removeIf() 方法用于删除所有满足特定条件的数组元素。
         */
        System.out.println("--- removeIf()  ---");
        System.out.println(strList);
        strList.removeIf(e->e.contains("e"));
        System.out.println(strList);// [c, d, o, l, q]
        System.out.println("--- removeIf() end ---");
    }
}
